package com.chenchao.javafile;

import java.io.*;
import java.util.Objects;
import java.util.Scanner;

/**
 * @encoding : UTF-8
 * @Time : 2020/11/16 9:46
 * @Author : Chen Chao
 * @File : javaSE.com.chenchao.javaFile.Test10.java
 * @Software : IntelliJ IDEA
 * @since : 1.8
 */
public class Test10 {
    final static File PATH = new File("myjava01/src/fo/");

    //服务器路径
    public static void main(String[] args) {
        push();
    }

    /**
     * 主程序
     */
    public static void push() {
        File file = getPath();
        if (isLegal(file)) {
            if (commit(file)) {
                System.out.println("上传成功！");
            } else {
                System.out.println("上传失败！");
            }
        } else {
            System.out.println("文件不合法,请重新录入！");
            push();
        }

    }

    /**
     * 获取用户输入的文件路径
     *
     * @return 返回包装好的文件对象
     */
    public static File getPath() {
        //获取用户输入的文件路径
        final Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.println("请输入文件路径");
            String str = scanner.nextLine();
            if (!str.endsWith(".jpg") && !str.endsWith(".ico")) {
                //判断是不是图像文件
                System.out.println("输入路径不是图像文件");
                continue;
            }
            //包装成File对象判断是否存在并且为文件
            File file = new File(str);
            if (file.isDirectory() || !file.exists()) {
                System.out.println("文件不存在或者是文件夹");
                continue;
            }
            return file;
            //返回文件对象
        }


    }

    /**
     * 判断传入的文件是否合法
     *
     * @param file 要传入的文件
     * @return true表示合法，false表示不合法
     */
    public static boolean isLegal(File file) {
        int available = 0;
        try (FileInputStream fileInputStream = new FileInputStream(file);) {
            available = fileInputStream.available();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //获取文件长度
        for (File listFile : Objects.requireNonNull(PATH.listFiles())) {
            //获取文件对象，服务器上是否存在同名文件
            if (listFile.getName().equals(file.getName())) {
                System.out.println("存在同名文件");
                return false;
            }

            try (FileInputStream fileInputStream = new FileInputStream(file);
                 FileInputStream fileInputStream1 = new FileInputStream(listFile);) {
                if (fileInputStream.available() == fileInputStream1.available()) {
                    //同名文件长度是否相同
                    byte[] bytes1 = new byte[1024];
                    byte[] bytes2 = new byte[1024];
                    int len = 0;
                    //同名文件字节是否相同
                    System.out.println("gg");
                    while ((len = fileInputStream.read(bytes1)) != -1) {
                        int read = fileInputStream1.read(bytes2);
                        for (int i = 0; i < len && i < read; i++) {
                            if (bytes1[i] != bytes2[i]) {
                                return true;
                            }
                        }
                    }
                    return false;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //返回结果
        return true;
    }

    /**
     * 上传图像
     *
     * @param file 传过来的合法文件对象
     * @return 返回上传结果
     */
    public static boolean commit(File file) {
        System.out.println("getFile");
        File file1 = new File(PATH, file.getName());

        try {
            //创建文件
            boolean newFile = file1.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try (FileInputStream fileInputStream = new FileInputStream(file1);
             FileOutputStream fileOutputStream = new FileOutputStream(file);) {
            //复制对象到服务器
            byte[] bytes = new byte[1024];
            int len = 0;
            while ((len = fileInputStream.read(bytes)) != -1) {
                fileOutputStream.write(bytes, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        //返回是否上传成功
        return true;
    }
}
